//
//  WBMainViewController.swift
//  WJ微博
//
//  Created by 王杰 on 2017/1/16.
//  Copyright © 2017年 WangJie. All rights reserved.
//

import UIKit

class WBMainViewController: UITabBarController {

    // 懒加载一个"+" 按钮
    lazy var composeBtn:UIButton = UIButton.cz_imageButton("tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")

    override func viewDidLoad() {
        super.viewDidLoad()

        // 设置子视图控制器
        setupChildControllers()
        // 初始化"➕"按钮
        setupComposeBtn()
    }
    
    // portrait： 竖屏
    // landscape： 横屏
    // 设备支持方向
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
    
        return .portrait
    }
}

// extension 类似于OC 中的分类，在Swift中还可以用来切分代码块
// 可以把相近功能的函数，放在一个extension 中。便于代码的维护
// 注意: 和 OC 的分类一样，extension 中不能定义属性
// MARK: - 设置界面
extension WBMainViewController {

    /// 设置所有子控制器
     func setupChildControllers() {
        
        // 0 获取沙盒目录
        let docDic = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let jsonPath = (docDic as NSString).appendingPathComponent("main.json")
        
        // 加载 data
        var data = NSData(contentsOfFile: jsonPath)
        
        // 判断data 是否有内容
        if data == nil {
            
            // 从bundle 中加载 data
            let path = Bundle.main.path(forResource: "main.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
        }
        
        // data 此时一定有值，接着进行反序列化
        guard let array = try? JSONSerialization.jsonObject(with: data! as Data, options: []) as? [[String:Any]]
            else { return }

        var arrayM = [UIViewController]()
        
        // 循环创建控制器数组
        for dict in array! {
            
            let vc = controller(dict: dict)
            arrayM.append(vc)
        }
        
        viewControllers = arrayM
    }

    /// 使用字典创建一个子控制器
    ///
    /// - Parameter dict: 信息字典假如这个字典里面有3个键值属性 [clsName, title, imageName, visitorInfor]
    /// - Returns: 子控制器
    private func controller(dict:[String: Any]) -> UIViewController {
        
        // 1 取出字典的内容  使用guard let 守卫
        // let clsName: Any
        guard let clsName = dict["clsName"] as? String,
                 let title = dict["title"] as? String,
                 let imageName = dict["imageName"] as? String,
                 let visitorInfor = dict["visitorInfor"] as?[String: String]
            else {
                return UIViewController()
            }
        
        // 2 创建视图控制器
        // let cls: AnyClass?
        // NSClassFromString 反射机制
//        let cls = NSClassFromString(Bundle.main.nameSpace + "." + clsName)
        // let cls: UIViewController.Type?
//        let cls = NSClassFromString(Bundle.main.nameSpace + "." + clsName) as? UIViewController.Type
//        let vc = cls?.init()
//        guard let cls = NSClassFromString(Bundle.main.nameSpace + "." + clsName) as? UIViewController.Type
        guard let cls = NSClassFromString(Bundle.main.nameSpace + "." + clsName) as? WBBaseViewController.Type
            else
        {
            return UIViewController()
        }
        // 创建视图控制器
        // 此处将115 行代码修改成116 行代码，主要是将 它的类型修改为基类WBBaseViewController.这样才能拿到 visitorInfoDic 属性
        let vc = cls.init()
    
        // 控制器的访客信息字典
        vc.visitorInfoDic = visitorInfor
        
        
        // 3 设置标题
        vc.title = title // 直接设置title 这样导航和tabBar title 都有值了
//        vc.tabBarItem.title = title; // 这种写法控制器没有标题
        
        // 4 设置tabBar 图标   tabbar_home_selected
        vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName)
//        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_selected")  // 选中图标颜色不是我们需要的颜色，被系统渲染成蓝色了
        // 不让它渲染选中的图片
        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_selected")?.withRenderingMode(.alwaysOriginal)

        // 5 设置tabBarItem 字体颜色
        let dict = [NSForegroundColorAttributeName:#colorLiteral(red: 0.8941176471, green: 0.5058823529, blue: 0.1215686275, alpha: 1)]
        // 设置字体颜色
         vc.tabBarItem.setTitleTextAttributes(dict, for: .highlighted)
        // 设置字体大小/***注意设置字体时必须用normal状态,否则无效*/
        vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName:UIFont.systemFont(ofSize: 12)], for: .normal)
        let nav = WBNavigationController(rootViewController: vc)
        // 多态
        return nav
    }
    
    // MARK: - 设置"➕"号按钮
    func setupComposeBtn() {
        
        // 1 添加"+" 按钮
        tabBar.addSubview(composeBtn)
        
        // 2 设置按钮的frame
////        let padding = tabBar.frame.size.width / 5
////        composeBtn.frame = CGRect(x: padding*2, y: 0, width: padding, height: tabBar.frame.size.height)
//        // 为了避免容错点干扰，把间距 缩小1 ，按钮变宽2
//        let padding = tabBar.frame.size.width / 5
//        composeBtn.frame = CGRect(x: padding*2 - 1, y: 0, width: padding + 2, height: tabBar.frame.size.height)
        
        // MARK: - 换种高级点的方式实现上面注释功能
        let count = CGFloat(childViewControllers.count)
        // 向内缩进
//        let w = tabBar.bounds.width / count 
        // 向内缩进宽度减小，让按钮宽度变大，遮住容错点。防止用户点击下方tabBar特殊位置不触发事件。
        let w = tabBar.bounds.width / count  - 1
        composeBtn.frame = tabBar.bounds.insetBy(dx: 2 * w, dy: 0)
        
        // 3 监听按钮点击事件
        composeBtn.addTarget(self, action: #selector(composeBtnPressed), for: .touchUpInside)
    }
    
    // MARK: - 监听按钮的点击事件
    func composeBtnPressed() {
    
        let addVc = WBAddViewController()
        // 用一个导航控制器包裹着WBAddViewController
        let nav = WBNavigationController(rootViewController: addVc)
        // modal 到WBAddViewController 界面
        present(nav, animated: true, completion: nil)
    }
}
